/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.cliente.empresa.vista;

import co.com.entities.Contacto;
import co.com.entities.Empresa;
import co.com.client.BaseView.CreateBase;
import co.com.cliente.Services;
import co.com.cliente.contacto.estructura.ContactoDS;
import co.com.cliente.contacto.estructura.ContactoRecord;
import co.com.cliente.empresa.estructura.EmpresaDS;
import co.com.cliente.empresa.estructura.EmpresaRecord;

import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DataSource;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.SelectionAppearance;
import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Button;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.grid.events.RecordDoubleClickEvent;
import com.smartgwt.client.widgets.grid.events.RecordDoubleClickHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author dloaiza
 */
public class EmpresaEditor extends CreateBase {

    private Empresa empresa;
    private HLayout accionesEmpresa;
    private DynamicForm frmEmpresa;
    private TextItem txtnit, txtrazonSocial, txtdireccion;
    private Button btnGuardar, btnLimpiar, btnEliminar;
    private SelectItem cbxcontacto;
    private ListGrid empresaGrid;
    private ContactoDS contactoDs;
    
    public EmpresaEditor() {
        super("Creación de Empresa", "100%");
        initComponents();
    }

    public EmpresaEditor(Empresa empresa) {
        super("Actualización de Empresa", "100%");
        this.empresa = empresa;
    }

    private void initComponents() {
        contactoDs =new ContactoDS();

        txtnit = new TextItem();
        txtnit.setTitle("NIT");
        txtnit.setWidth(200);
        txtnit.setRequired(true);
        txtnit.setName("txtnit");
        txtnit.setLength(20);
        txtnit.setAlign(Alignment.LEFT);
        txtnit.setWrapTitle(false);

        txtrazonSocial = new TextItem();
        txtrazonSocial.setTitle("Razón social");
        txtrazonSocial.setWidth(200);
        txtrazonSocial.setRequired(true);
        txtrazonSocial.setName("txtrazonSocial");
        txtrazonSocial.setLength(200);
        txtrazonSocial.setAlign(Alignment.LEFT);
        txtrazonSocial.setWrapTitle(false);

        txtdireccion = new TextItem();
        txtdireccion.setTitle("Dirección");
        txtdireccion.setWidth(200);
        txtdireccion.setRequired(true);
        txtdireccion.setName("txtdireccion");
        txtdireccion.setLength(200);
        txtdireccion.setAlign(Alignment.LEFT);
        txtdireccion.setWrapTitle(false);



        btnGuardar = new Button("Guardar");

        btnLimpiar = new Button("Limpiar");

        btnEliminar = new Button("Eliminar");

        cbxcontacto = new SelectItem();
        cbxcontacto.setTitle("Contacto");
        cbxcontacto.setName("cbxcontacto");
        cbxcontacto.setRequired(true);
        cbxcontacto.setWidth(200);
        cbxcontacto.setDisplayField(ContactoDS.NOMBRE);
        cbxcontacto.setValueField(ContactoDS.IDENTIFICACION);
        cbxcontacto.setAlign(Alignment.LEFT);
        cbxcontacto.setWrapTitle(false);

        accionesEmpresa = new HLayout();
        accionesEmpresa.setMargin(20);
        accionesEmpresa.setMembersMargin(20);
        accionesEmpresa.setHeight(50);
        accionesEmpresa.setWidth("100%");
        accionesEmpresa.setAlign(Alignment.CENTER);
        accionesEmpresa.setMembers(btnGuardar, btnLimpiar, btnEliminar);

        frmEmpresa = new DynamicForm();
        frmEmpresa.setNumCols(4);
        frmEmpresa.setItems(txtnit, txtrazonSocial, txtdireccion, cbxcontacto);
        
        empresaGrid = new ListGrid();
        empresaGrid.setWidth100();
        empresaGrid.setHeight100();
        empresaGrid.setDataSource(new EmpresaDS());
        empresaGrid.setAutoFetchData(true);
        empresaGrid.setFields(EmpresaRecord.getFields());
        empresaGrid.setEmptyMessage("No hay registros para mostrar");
        empresaGrid.setSelectionType(SelectionStyle.SIMPLE);
        empresaGrid.setSelectionAppearance(SelectionAppearance.CHECKBOX);
        empresaGrid.setFilterOnKeypress(true);
        empresaGrid.setShowFilterEditor(true);
        empresaGrid.addRecordDoubleClickHandler(new RecordDoubleClickHandler() {
            @Override
            public void onRecordDoubleClick(RecordDoubleClickEvent event) {
                 empresa = (Empresa) event.getRecord().getAttributeAsObject("Empresa");
                 txtnit.setValue(empresa.getDsnit()==null?"":empresa.getDsnit());
                 txtrazonSocial.setValue(empresa.getDsrazonSocial());
                 txtdireccion.setValue(empresa.getDsdireccion()==null?"":empresa.getDsdireccion());
                 cbxcontacto.setValue(empresa.getDsidContacto()==null?"":empresa.getDsidContacto().getDsidentificacion());
                 txtnit.setDisabled(true);
            }
        });

        AddActionBarItem(accionesEmpresa);
        VLayout contenedor = new VLayout();
        contenedor.setMembers(frmEmpresa, empresaGrid);
        AddFormContainerItem(contenedor);

        btnGuardar.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                if (frmEmpresa.validate()) {
                    
                    if(empresa==null){
                        Services.getEmpresaServices().guardarEmpresa(getEmpresa(), new AsyncCallback<Void>() {

                            public void onFailure(Throwable caught) {
                            SC.say("Error en creación de empresa", caught.getMessage());
                        }

                        public void onSuccess(Void result) {
                            SC.say("Creación de empresa", "Señor usuario, la empresa fue registrada correctamente");
                            asteroideLoad();
                        }
                        });
                    }
                    else{
                        Services.getEmpresaServices().actualizarEmpresa(getEmpresa(), new AsyncCallback<Void>() {

                            public void onFailure(Throwable caught) {
                                SC.say("Error en actualización de empresa", caught.getMessage());
                            }

                            public void onSuccess(Void result) {
                                SC.say("Actualización de empresa", "Señor usuario, la empresa fue actualizada correctamente");
                                asteroideLoad();
                            }
                        });
                    }
                    
                }
            }
        });
        btnLimpiar.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                frmEmpresa.clearValues();
                txtnit.setDisabled(false);
            }
        });
        btnEliminar.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                ListGridRecord[] selectedRecords = empresaGrid.getSelection();
                final List<Empresa> empresasToDelete = new ArrayList<Empresa>(selectedRecords.length);


                for (ListGridRecord rec : selectedRecords) {
                    empresasToDelete.add((Empresa) rec.getAttributeAsObject("Empresa"));
                }
                if (empresasToDelete.isEmpty()) {

                    SC.warn("Debe seleccionar al menos una empresa para poder eliminar");
                    return;
                } else {
                    SC.confirm("Confirmar Eliminación", "¿Esta seguro que desea eliminar las empresas seleccionadas?", new BooleanCallback() {

                        @Override
                        public void execute(Boolean value) {
                            if (value) {
                                AsyncCallback<Void> updateStateCallback = new AsyncCallback<Void>() {

                                    @Override
                                    public void onFailure(Throwable caught) {
                                        Logger.getLogger(getClass().getName()).log(Level.INFO, "Mensaje informativo... no se pudo eliminar el producto debido a: " + caught.getMessage());
                                        SC.say("Eliminación de empresas", caught.getMessage());
                                    }

                                    @Override
                                    public void onSuccess(Void result) {
                                        SC.say("Eliminación de empresas", "Señor usuario, la(las) empresa(s) se han eliminado correctamente");
                                        asteroideLoad();
                                    }
                                };
                                Services.getEmpresaServices().eliminarEmpresas(empresasToDelete, updateStateCallback);
                            }
                        }
                    });
                }
            }
        });

        cargarContacto();
        asteroideLoad();
    }
    
    private void asteroideLoad(){
        Services.getEmpresaServices().consultarEmpresas(new AsyncCallback<List<Empresa>>() {

            public void onFailure(Throwable caught) {
                caught.getMessage();
            }

            public void onSuccess(List<Empresa> result) {
                clearResults();
                DataSource ds = empresaGrid.getDataSource();
                for (int i = 0; i < result.size(); i++) {
                    ds.addData(new EmpresaRecord(result.get(i)));
                }
            }
        });
    }
    
    private void clearResults() {
        DataSource ds = empresaGrid.getDataSource();
        for (ListGridRecord record : empresaGrid.getRecords()) {
            ds.removeData(record);
        }
    }
     
    public  Empresa getEmpresa(){
        if(empresa == null){
            empresa = new Empresa();
        }
        Contacto contacto = cbxcontacto.getSelectedRecord().getAttributeAsObject("Contacto")==null?null:(Contacto) cbxcontacto.getSelectedRecord().getAttributeAsObject("Contacto");
        empresa.setDsidContacto(contacto);
        empresa.setDsdireccion(txtdireccion.getValueAsString());
        empresa.setDsnit(txtnit.getValueAsString());
        empresa.setDsrazonSocial(txtrazonSocial.getValueAsString());
        return empresa;
    }
    
    public void cargarContacto() {
        Services.getContactoServices().consultarContactos(new AsyncCallback<List<Contacto>>() {

            public void onFailure(Throwable caught) {
                Logger.getLogger(getClass().getName()).log(Level.INFO, "Mensaje informativo...no se cargaron los cargos de empleados: " + caught.getMessage());
            }

            public void onSuccess(List<Contacto> contactos) {

                for (int i = 0; i < contactos.size(); i++) {
                    contactoDs.addData(new ContactoRecord(contactos.get(i)));
                }
                cbxcontacto.setOptionDataSource(contactoDs);
            }
        });
    }
}